package com.ftg.learn.chapter02.java.lambda;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.*;

/**
 * 。。。 -
 *
 * @author kangjx
 * @version 1.0
 * @date 2023/12/21 上午9:16
 */
public class YongFa {

    public static void main(String[] args) {
//        参数列表 -> 表达式
//        没有参数 ： ()->{}
//        有一个参数时 : x ->{}
//        有多个参数时 : (x,y) ->{}
//        表达式 ：
//        如果只有一行时,return 以及 {}可以省略
//        多个语句时,return 以及 {}不能省略

        //函数调用
        IBaseShuxue<Integer, Integer> jiafa = Integer::sum;

        IBaseShuxue<Integer, Integer> qedaxiao = Integer::max;

        IBaseShuxue<Integer, Integer> jianfa = (x, y) -> x - y;

        IBaseShuxue<Double, Double> cimi = Math::pow;


        System.out.println(jiafa.yunsuan(2, 3));
        System.out.println(qedaxiao.yunsuan(34, 56));

        // 给两个字符串，判断第一个字串是不是第二个字符串开头
        IBaseShuxue<Boolean, String> isStart = String::startsWith;
        IBaseShuxue<Boolean, String> isEnd = String::endsWith;
        IBaseShuxue<Boolean, String> isContains = String::contains;
        //lambda 语法糖

//        1 : 消费型函数式接口
        Consumer<String> s = System.out::println;
//        BiConsumer
        s.accept("sssss");

//        2: 供给型函数式
        Supplier<String> su = () -> "abc";
        System.out.println(su.get());

        Supplier<Student> su1 = Student::new;
        System.out.println(su1.get());

        Supplier<Student> su2 = ()->{
            Student s1 = new Student();
            s1.setSno(110);
            s1.setSname("张三丰");
            return s1;
        };

//        3: 函数式接口
        Function<String,Integer> fn = (x)->x.indexOf("康");
        BiFunction<Integer,Integer,Integer> fn1 = Integer::sum;
        Integer apply = fn1.apply(3, 4);
        System.out.println(apply);

//        4: 断言式
        Predicate<String> pre1 = x -> x.startsWith("康");
        pre1.test("康加修");
        List<Integer> list1 = filter(Arrays.asList(1,2,3,4,5,6,7,8,9,10), x -> x % 3 == 0);
        System.out.println(list1);
    }

    public static List<Integer> filter(List<Integer> list, Predicate<Integer> pre){
        List<Integer> rs = new ArrayList<>();
        for (int i = 0; i < list.size(); i++) {
            if(pre.test(list.get(i))){
                rs.add(list.get(i));
            }
        }
        return rs;
    }

}
